package main

import (
	"fmt"
)

// func slicecopy(to, fm slice, width uintptr) int {
//     // 如果源切片或者目标切片有一个长度为0，那么就不需要拷贝，直接 return
//     if fm.len == 0 || to.len == 0 {
//         return 0
//     }
//     // n 记录下源切片或者目标切片较短的那一个的长度
//     n := fm.len
//     if to.len < n {
//         n = to.len
//     }
//     // 如果入参 width = 0，也不需要拷贝了，返回较短的切片的长度
//     if width == 0 {
//         return n
//     }
//     // 如果开启了竞争检测
//     if raceenabled {
//         callerpc := getcallerpc(unsafe.Pointer(&to))
//         pc := funcPC(slicecopy)
//         racewriterangepc(to.array, uintptr(n*int(width)), callerpc, pc)
//         racereadrangepc(fm.array, uintptr(n*int(width)), callerpc, pc)
//     }
//     // 如果开启了 The memory sanitizer (msan)
//     if msanenabled {
//         msanwrite(to.array, uintptr(n*int(width)))
//         msanread(fm.array, uintptr(n*int(width)))
//     }

//     size := uintptr(n) * width
//     if size == 1 {
//         // TODO: is this still worth it with new memmove impl?
//         // 如果只有一个元素，那么指针直接转换即可
//         *(*byte)(to.array) = *(*byte)(fm.array) // known to be a byte pointer
//     } else {
//         // 如果不止一个元素，那么就把 size 个 bytes 从 fm.array 地址开始，拷贝到 to.array 地址之后
//         memmove(to.array, fm.array, size)
//     }
//     return n
// }
// func slicestringcopy(to []byte, fm string) int {
//     // 如果源切片或者目标切片有一个长度为0，那么就不需要拷贝，直接 return
//     if len(fm) == 0 || len(to) == 0 {
//         return 0
//     }
//     // n 记录下源切片或者目标切片较短的那一个的长度
//     n := len(fm)
//     if len(to) < n {
//         n = len(to)
//     }
//     // 如果开启了竞争检测
//     if raceenabled {
//         callerpc := getcallerpc(unsafe.Pointer(&to))
//         pc := funcPC(slicestringcopy)
//         racewriterangepc(unsafe.Pointer(&to[0]), uintptr(n), callerpc, pc)
//     }
//     // 如果开启了 The memory sanitizer (msan)
//     if msanenabled {
//         msanwrite(unsafe.Pointer(&to[0]), uintptr(n))
//     }
//     // 拷贝字符串至字节数组
//     memmove(unsafe.Pointer(&to[0]), stringStructOf(&fm).str, uintptr(n))
//     return n
// }
func main() {
    array := []int{10, 20, 30, 40}
    slice := make([]int, 6)
    n := copy(slice, array)
	fmt.Println(n,slice)
	
	 slice1 := make([]byte, 3)
    n1 := copy(slice1, "abcdef")
	fmt.Println(n1,slice)
	
	slice2 := []int{10, 20, 30, 40}
    for index, value := range slice2 {
        fmt.Printf("value = %d , value-addr = %x , slice-addr = %x\n", value, &value, &slice2[index])
    }
}